明天放颱風假了!提醒中南部的各位明天沒事別出門,這次颱風感覺有點厲害……
今天終於來到第19天,明天開始爲期10天我們將進入深度學習的部分,在今天這一章,我想我們可以來復習一下這19天都學習了哪些知識。
在一開始,我們就學習了什麽是機器學習,我們知道了機器學習就是讓機器去找到一組function,這個function的input可以是任何的東西,可能是數值、文字、聲音、影片等等,我們希望機器在接受我們的input過後可以給我們相對應的output,比如傳進去一段話,給我這段話的文字;傳進去一張圖片,告訴我這張圖片裏面有什麽東西;
至於怎麽找到這組function呢?首先我們需要準備一組function set,這組function set裏面有千千萬萬個function,然後我們讓機器去自動調整這個function set裏面的參數,怎麽調整呢?就是通過定義一個Loss function,這個loss function的input是另外一個function,或是我們可以説,是另外一個function裏面的所有參數。
我們找到了一個function和它相對應的loss了之後我們可以做什麽呢?那就是看我們對這個Loss function算出來的值滿不滿意,如果我們覺得這個loss function算出來的值是我們可以接受的,我們就會停止我們的模型訓練,那如果不接受呢?那我們就需要通過一些演算法來幫助我們減少我們的loss,然後去更新我們的參數。這樣的演算法我們稱之爲backpropogation反向傳播。反向傳播的其中一種著名的方法,就叫做gradient decent。
Gradient decent顧名思義,就是通過找出你的function的梯度,然後往梯度的反方向行走,至於要走多遠?我們需要通過一個hyperparameter來調整,這個hyperparameter就叫做學習率η
(eta)。那麽通過不斷更新參數,再不斷計算梯度,就這樣往復循環下去,直到我們不想做了,或是對模型的loss function算出來的值感到滿意了,我們就停止我們的模型訓練。
所以總結來説,機器學習就三個步驟:
在第一步的時候我們需要思考我們要做的任務是什麽?我們是要預測一個數值嗎?如果是的話,我們可能會用最簡單的linear regression模型;如果是分類的話,我們可能會考慮一個logistics regression的模型,這取決於我們想要解的任務。
一個linear model的公式是十分簡單的,具體來説,公式如下:y = w_n * x_n + b
這邊的下標n代表的是你有幾個feature,假設說你今天要計算的數值,影響這個數值的原因有很多,比如説房子的價格可能會受到面積、地段、公設、周圍鄰居等因素影響,那麽就是有多少個feature(x),每個feature都會有一個對應的w,而b代表的是偏移項,用來解釋一些沒辦法解釋的原因,這個沒辦法解釋的原因可能是我們在做特徵工程的時候,可能忽略了一些因素,或是一些隨機的變動等等。
當我們可以用綫性模型去預測一個數值,那麽有沒有一種可能,這條直綫,可以幫助我們去分類我們的數據呢,比如我在一個二維的平面上找到一條直綫,這條直綫以左是Class A,這條直綫以右是Class B,所以我們其實可以用同一個綫性模型,去幫我們解預測數值的問題,也可以解分類的問題,這就是logistics regression。
logistic regression其實有兩種做法,這兩種做法在數學上其實是一模一樣的,他們是同樣的function,也使用同樣的loss function,那麽這兩種做法分別是什麽呢?它們分別是Generative和Discriminative的方法。
那麽這兩種方法有什麽不一樣呢,一般上來説,如果我們單純的就是通過logistic regression去找一組w和b,那麽我們就是Discriminative的方法,而Generative的方法是説我們對這個model的sample做了一些假設,我們可能假設我們的data是從一個Gaussian的distribution sample出來的,或是可能是從bernoulli的distribution sample出來的,當我們對這些data做了一些假設,我們的model就會自動幫我們腦補一些東西,這些東西是原本的data裏面是看不出來的,但是因爲我們對這些data做了一些假設,所以導致我們的模型自動幫我們腦補了一些事情這樣。這樣做的優點有什麽呢?當我們的data很少的時候,Generative的方法對我們比較有利,而當我們的data足夠多的時候,用Discriminative的方法,它的performance會比較好。
其實我們説了這麽多,也才學了兩個模型,但爲什麽我們要花這麽多時間學這兩個模型呢?那是因爲我們在為deep learning的部分鋪路。我們用一個linear model去做到綫性回歸,然後再用一個linear model,通過導入非綫性函數(激活函數)如sigmoid、tanh等使得我們的綫性模型可以做到分類的任務,如果我們找到了很多個sigmoid,把每一個稱作一個neuron,然後將很多個neuron cascade起來,那我們就得到了一個neural network。看,是不是一切都和deep learning連起來了。
step 2的部分其實就是去想盡辦法,比較兩個set之間的差異性到底有多大,常見的MAE、MSE等可以用在綫性回歸,而要比較兩個機率模型的話,就能用KL散度或是cross-entropy的方式去比較差異,而我們一系列的學習重點,也主要圍繞在cross-entropy上。
説白了,當我們比較兩個set的時候,爲了能夠有效的比較,我們需要一個統一的值才能做有效對比,比如説我們現實生活中也需要用統一的單位,比如説長度可能會用公分、公尺,哪怕是不同單位,我們也有辦法在他們之間進行轉換;又像是貨幣也是一樣,不同國家的貨幣都有兌換率,所以也可以當作一個統一的值。而比較兩個集合的時候,我們需要考慮到他們可能是來自不同的分佈,因此我們需要一個值能夠計算不同的系統的混亂程度,再通過計算出來的值去做比較,這個東西就叫做entropy,而我們可能常用的單位是以2為底數,取得的單位就是bits。基本上,KL散度和cross-entropy都是利用了entropy的概念去推導的,cross-entropy是一個很好的工具用來衡量兩個機率模型的相似程度,具體的細節我們之前在說logistics regression的時候就已經討論過了,這邊就不再贅述。
我們在進行optimization的時候會需要一些策略,這個策略就叫做gradient decent。然而,gradient decent是有一些缺點的,所以一個vanilla 的 gradient decent通常不會是我們的選擇,我們通常使用的是SGD、AdaGrad、Adam等策略,其中這些策略裏面,有一些方法如Momentum、Root Mean Square、RMSProp等,還有Learning Rate Scheduling,這些方法也可以互相搭配來一套組合拳,如Adam演算法就是RMSProp+Momentum。
最後,我想聊一下Activation funtion,激活函數。這個激活函數應該是很多人學了半懂半不懂的。我們在使用綫性模型的時候,可能會遇到綫性模型沒辦法解決的時候,這時候我們可以通過一些非線性的激活函數如sigmoid,tanh,softmax,relu等,他們有各自的特性,通常以現在來説,sigmoid在大部分時候都有很多的缺點,所以可能會較常使用tanh來替代sigmoid;而softmax是在多類別分類的時候很好用,它會强化最大值,將本來的差距拉的更大,而我們可能在多標簽的時候,會對每一個標簽用sigmoid函數。